package net.jqsoft.mvc.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import net.jqsoft.common.domain.JsonResult;
import net.jqsoft.common.entity.SuperEntity;
import net.jqsoft.common.query.PageResult;
import net.jqsoft.common.support.RepositoryService;

import java.io.Serializable;
import java.util.Map;

/**
 * 
 * 超类Controller提供基于Service的增删改方法
 * 
 * 
 * 
 * 
 * @author wangjie
 *
 */
public abstract class SuperController<S extends Serializable, T extends SuperEntity<S>, M extends RepositoryService<T>>  extends BaseController{

	@Autowired
	protected M service;

	/**
	 * <p>
     * 分页查询，返回JSON数据
     * </p>
     * 
     * @param page 当前页
     * @param limit 每页显示条数
     * @return JsonResult JSON响应
     */
    @RequestMapping("page")
    @ResponseBody  
    protected JsonResult page(@RequestParam(defaultValue = "1") Integer page
    					,@RequestParam(defaultValue = "20") Integer limit
    					,@RequestParam Map<String, Object> params) {
    	PageResult<T> pageResult = this.doPage(page,limit,params);
        return  this.renderSucceed()
        		.add("count", pageResult.getTotal())
        		.addData(pageResult.getRecords());
    }

	/**
	 * <p>
	 * 具体分页的逻辑交由具体实现类处理
	 * </p>
	 * <p>
	 * 如果是单表查询 直接使用持久化插件中提供的默认分页方法
	 * <p>
	 * 如果是多表关联查询 需要自己实现分页查询方法
	 * </p>
	 *  
	 */
	protected abstract PageResult<T> doPage(Integer page,Integer limit,Map<String, Object> params);

	/**
	 * 根据主键查询实体
	 * 
	 * @param id  主键
	 * @return T 实体
	 */
	@RequestMapping("get/{id}")
	@ResponseBody
	protected T get(@PathVariable("id") S id) {
		return service.findOne(id);
	}

	/**
	 * 根据主键删除实体
	 * 
	 * @param id  主键
	 * @return JsonResult 操作结果
	 */
	@RequestMapping("delete/{id}")
	@ResponseBody
	protected JsonResult delete(@PathVariable("id") S id) {
		service.deleteById(id);
		return this.renderSucceed(MSG_DELETE_SUCCEED);
	}
	
	/**
	 * 保存实体，根据实体主键是否优值决定插入或修改
	 * 
	 * @param T  实体
	 * @return JsonResult 操作结果
	 */
	@RequestMapping("save")
	@ResponseBody
	protected JsonResult save(T t) {
		boolean isUpdate = false;
		if (t.getId() != null&&!"".equals(t.getId())) isUpdate = true;
		service.save(t);
		return this.renderSucceed(isUpdate?MSG_UPDATE_SUCCEED:MSG_INSERT_SUCCEED);
	}
}